#include <linux/init.h>//包含宏定义得头文件
#include <linux/module.h>//包含初始化加载模块得头文件
#include <linux/i2c.h>

/*包含头文件*/
/****************I2c驱动框架driver文件创建*************
在没有设备树的情况下是需要client文件构建一个结构体来实现，查看client的节点在文件
/sys/bus/i2c/devices下的i2c0 创建文件定义client需要把设备树的节点去掉
* (1)调试方法:cat /proc/irq/4/spurious(可以查看打印)
* (2)
* (3)
* (4)
* (5)
***********************************************************************/
/*宏定义*/
static struct i2c_client*ft5x06_client;
static int ft5x06_read_reg(u8 reg_addr);
static void ft5x06_write_reg(u8 reg_addr,u8 data,u8 len);

static int ft5x06_read_reg(u8 reg_addr)
{
    u8 data;
    struct i2c_msg msgs[]={
        [0]={
            .addr =.ft5x06_client->addr,//用于获取probe函数中的client的值
            .flags=0,
            .len=sizeof(reg_addr),
            .buf=&reg_addr,
        },
        [1]={
            .addr =.ft5x06_client->addr,//用于获取probe函数中的client的值
            .flags=1,
            .len=sizeof(data),
            .buf=&data,
        },
    };
    i2c_transfer(ft5x06_client->adapter,msgs,2);
    return data;
}
/*iic写函数*/
static void ft5x06_write_reg(u8 reg_addr,u8 data,u8 len)
{
    u8 buff[256];
    struct i2c_msg msgs[]={
        [0]={
            .addr =.ft5x06_client->addr,//用于获取probe函数中的client的值
            .flags=0,
            .len=len,
            .buf=buff,
        },
    };
    buff[0]=reg_addr;
    memcpy(&buff[1],&data,len);//拼接数据函数
    i2c_transfer(ft5x06_client->adapter,msgs,1);
}

int i2c_probe(struct i2c_client*client,const struct i2c_device_id*id)
{
    int read_reg;
    printk("this i2c_probe ok\n");
    ft5x06_client=client;//因为我们需要在别的地方需要用到这个client，所以我们把他复制出来
    //往地址为0x80的寄存器写入数据0x4b
    ft5x06_write_reg(0x80,0x4b,1);
    //读取寄存器地址为0x80的数据
    read_reg=ft5x06_read_reg(0x80);

    printk("this is:%#x\n",read_reg);
    return 0;
}

int i2c_remove(struct i2c_client*i2c_client)
{
    printk("this i2c_remove ok\n");
    return 0;
}

static const struct of_device_id ft5x06_id[]={
    {.compatible="edt,edt-ft5306",0},
    {.compatible="edt,edt-ft5306",0},
    {.compatible="edt,edt-ft5306",0},

};
static const struct i2c_device_id i2c_id_ts[]={
    {"xxx",0},
    {}
}

/*初始化i2c结构*/
static struct i2c_driver ft5x06_driver={
    .driver={
        .owner=THIS_MODULE,
        .name="ft5x06_test",
        .of_match_table=ft5x06_id,
    },
    .pobe=i2c_probe,
    .remove=i2c_remove,
    .id_table=&i2c_id_ts
};

static int ft5x05_driver_init(void)
{
   int i2c_reg;
   i2c_reg=i2c_add_driver(&ft5x06_driver);//注册进内核中
   if(i2c_reg<0)
   {
       printk("this i2c_add_driver error\n");
        return i2c_reg;
   }
   printk("this ft5x05_driver_init\n");
   return 0;
}


static void ft5x05_driver_exit(void)//退出函数没有返回值
{
    i2c_del_driver(&ft5x06_driver);
    printk("this ft5x05_driver_exit\n");
}
/*功能实现*/

module_init(ft5x05_driver_init);
module_exit(ft5x05_driver_exit);
/*驱动的出口与入口函数都在此处*/
MODULE_LICENSE("GPL");
/*申明信息*/
